#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef char ElemType;
typedef struct SeqStack{
    ElemType data[MaxSize]; // 静态数组存放栈的元素
    int top; // 栈顶
}SeqStack;

// 初始化栈
void initStack(SeqStack &S){
    S.top = -1;
}
// 判断栈是否为空
bool isEmpty(SeqStack S){
    return (S.top == -1);
}
// 入栈操作
bool push(SeqStack &S,ElemType elem){
    // 栈已满，不可入栈
    if(S.top == MaxSize - 1) return false;
    S.data[++S.top] = elem;
    return true;
}
// 出栈操作
bool pop(SeqStack &S,ElemType &elem){
    // 栈空，不可出栈
    if(S.top == -1) return false;
    elem = S.data[S.top--];
    return true;
}

// 括号校验代码
bool bracketCheck(char arr[],int length){
    SeqStack S;
    // 初始化栈
    initStack(S);
    for(int i=0;i<length;i++){
        char c = arr[i];
        if( c == '{' || c == '[' || c == '('){
            push(S,c); // 左括号进行入栈操作
        }else{
            // 当前为右括号，则栈进行出栈操作
            if(isEmpty(S)) return false; // 栈空，则匹配失败
            char left;
            pop(S,left);
            // 出栈后的元素与当前的括号不配对，则匹配失败
            if(c == '}' && left != '{') return false;
            if(c == ']' && left != '[') return false;
            if(c == ')' && left != '(') return false;
        }
    }
    return isEmpty(S); // 检索完全部后，若栈空，则说明匹配成功
}

int main() {
    char arr[10] = { '{','[','(',')','(','}'};
    bool flag = bracketCheck(arr, 6);
    if (flag) {
        printf("match success");
    }
    else {
        printf("match failed");
    }
    return 0;
}